// request.js
function requestData(url) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(url);
    }, 2000);
  });
}

// 1.
// requestData("frank").then((res) => {
//   requestData(res + "aaa").then((res) => {
//     requestData(res + "bbb").then((res) => {
//       console.log(res);
//     });
//   });
// });

// 2. Promise中then的返回值来解决
// requestData("frank")
//   .then((res) => {
//     return requestData(res + "aaa");
//   })
//   .then((res) => {
//     return requestData(res + "bbb");
//   })
//   .then((res) => {
//     console.log(res);
//   });

// 3. Promise + generator
// function* getData() {
//   const res1 = yield requestData("frank");
//   const res2 = yield requestData(res1 + "aaa");
//   const res3 = yield requestData(res2 + "bbb");
//   console.log(res3);
// }

// 手动执行生成器函数
// const generator = getData();
// generator.next().value.then((res) => {
//   generator.next(res).value.then((res) => {
//     generator.next(res).value.then((res) => {
//       generator.next(res);
//     });
//   });
// });

// function execGenerator(genFn) {
//   const generator = genFn();

//   function exec(res) {
//     const result = generator.next(res);
//     if (result.done) {
//       return result.value;
//     }
//     result.value.then((res) => {
//       exec(res);
//     });
//   }

//   exec();
// }

// execGenerator(getData);

/* 
  npm包 --->  co
*/
// const co = require("co");
// co(getData);

// 4. async / await
async function getData() {
  const res1 = await requestData("frank");
  const res2 = await requestData(res1 + "aaa");
  const res3 = await requestData(res2 + "bbb");
  console.log(res3);
}

getData();
